/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package report;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import test.bean.CiudadBean;

/**
 *
 * @author cuero
 */
public class Report {

    private Connection connection;

    public Report(Connection connection) {
        this.connection = connection;
    }

    // iniciamos la conexión con la base de datos
    public void initConection() throws SQLException {

        try {

            // cargamos el driver
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            if (this.connection == null) {
                // establecemos la conexión
                this.connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/city", "root", "toor");
            }

        } catch (InstantiationException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int mortalidad() {
        
        return 0;
    }

    public ResultSet ejecutarSQLSelect(String sql) {
        ResultSet resultado;
        try {
            Statement sentencia = connection.createStatement();
            resultado = sentencia.executeQuery(sql);
        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }

        return resultado;
    }

    public void toPdf() {
        ServletOutputStream servletOutputStream = null;
        try {

            initConection();

            // Nos posisionamos en la carpeta [/WEB-INF/] y obtenemos el archivo [reportCity.jasper]
            String path = FacesContext.getCurrentInstance().getExternalContext().getRealPath("WEB-INF/" + "reportCityP.jasper");

            // Generamos un archivo print con los datos de la base de datos
            JasperPrint jasperPrint = JasperFillManager.fillReport(path, null, this.connection);
            // Generamos un archivo .pdf, éste es el reporte
            JasperExportManager.exportReportToPdfFile(jasperPrint, "reporteCitys");

            // Permite que el usuario descargue el archivo
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            httpServletResponse.addHeader("Content-disposition", "attachment; filename=" + "reporteCitys" + ".pdf");
            servletOutputStream = httpServletResponse.getOutputStream();


            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
            FacesContext.getCurrentInstance().responseComplete();


        } catch (IOException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JRException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(CiudadBean.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
                if (servletOutputStream != null) {
                    servletOutputStream.close();
                }
            } catch (SQLException ex) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error close", "SQL" + ex.getMessage()));
            } catch (IOException ex) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error close", "IO " + ex.getMessage()));
            }
        }
    }
}
